#ifndef GENETICALGORITHM_H
#define	GENETICALGORITHM_H

#include "MetaHeuristic.h"
#include "Problem.h"
#include "oInitializer.h"
#include "oCrossover.h"
#include "oMutation.h"

//usado no critério de parada. Indica que a população
//convergiu para best, e se certifica disso por 20 gerações
#define  POPSTALLINGMAXCOUNT      30 //TODO: esse cara tem que ser ajustado
#define  POPSTALLINGTHRESHOLD  0.01 //TODO: teoricamente esse cara não precisa ser ajustado, pois foi "fitado"

class GeneticAlgorithm : public MetaHeuristic {
public:

    GeneticAlgorithm() {
    }

    virtual ~GeneticAlgorithm() {
    }

    virtual const char* name()const;
    virtual const char* description()const;
    virtual void parameters(LinkerParameters *com) throw (exception);
    virtual void services(LinkerNodes *com) throw (exception);
    virtual void execute() throw (exception);
    virtual void results(LinkerResults *com) throw (exception);
    void MergeInplace(vector<Solution*> & v1, vector<Solution*> & v2);
    bool isPopStalling(std::vector<Solution*> & pop);

private:
    int numero_individuos;
    Problem* problem;

    oInitializer* init;
    oCrossover* cross;
    oMutation* mut;
    Solution* best;
};

#endif
